

#ifndef HUFFMAN_H
#define	HUFFMAN_H
//#include "preprocesamiento.h" asd


//Nodos internos del árbol de Huffman
// unsigned char para el código de huffman (1 byte, quizas necesitemos mas)

//class Nodo_arbol{ 
//
//public:
//    Nodo_arbol* h_izq;
//    Nodo_arbol* h_der;
//    unsigned short frec;
//    unsigned char ch;
//     
//    Nodo_arbol(){}
//    Nodo_arbol(unsigned short frecuencia){
//        frec = frecuencia;
//    }
//    Nodo_arbol( unsigned short frecuencia, unsigned char character ){
//        frec = frecuencia;
//        ch = character;
//        h_izq = h_der = NULL;
//    }
//};

typedef struct datoArbol{
		unsigned char ch;
		long frec;
		}datoArbol;

typedef struct nodoArbol{
	   datoArbol dato;
	   nodoArbol *h_izq;
	   nodoArbol *h_der;
	   }nodoArbol;

typedef struct nodoListaEnlazada{
    nodoListaEnlazada *sig;
    nodoListaEnlazada *ant;
    nodoArbol *dato;
}nodoLE;

typedef struct listaEnlazada{
    nodoLE* pri;
    nodoLE* ult;
}listaEnlazada;
/*
class Hoja_arbol : public Nodo_arbol{
    unsigned short frec;
    unsigned char ch;
    Hoja_arbol( unsigned short frec, unsigned char ch ){
        this->frec = frec;
        this->ch = ch;
    }
};*/
//
//class Arbol {
//    
//public:
//    Nodo_arbol* raiz;
//    Arbol(Nodo_arbol* nodo){
//        raiz = nodo;
//    }
//private:
//  
//};

void iniciar_vFrecuencias(vFrecuencias_t* vFrecuencias, int tamanio);

nodoArbol* armar_arbol(vFrecuencias_t* vFrecuencias, int tam_vfrec);

int comprimir_huffman(vFrecuencias_t* vFrecuencias,unsigned char charR,ostream& archivo_comprimido);

void destruir_arbol(nodoArbol* raiz);

int actualizarFrecuencias(vFrecuencias_t * vFrecuencias,unsigned char charR);

bool codificar_caracter(nodoArbol* raiz, stack<bool>* pila, unsigned char charR);

int ordenarVFrecuencias(vFrecuencias_t* vFrecuencias);


#endif	/* HUFFMAN_H */


